package com.openlogic.common.logic.node.parse;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.noear.solon.annotation.Component;
import org.noear.solon.core.event.AppBeanLoadEndEvent;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.openlogic.common.logic.node.enums.ParseTypeEnums;
import com.openlogic.common.logic.node.factory.NodeParseFactory;

/**
* @ClassName: AreaParse
* @Description: 循环域节点解析处理器 
* @author weiyongpeng
* @date 2024年7月14日 上午11:50:47
 */
@Component
public class AreaParseHandler extends BaseParseHandler {
	
//	private static final Logger logger = LoggerFactory.getLogger(DefaultParseHandler.class);

	@Override
	protected Map<Object, List<?>> setResultMap(JSONObject nodeInfoJsonObject, JSONObject lineInfoJsonObject) {
		// logger.info("开始解析所有Area节点...");
		Map<Object, List<?>> map = new TreeMap<Object, List<?>>();
		// 设置字段含义
		map.put("Name", setFiledName(ParseTypeEnums.AREA_INFO.getParsetype()));
		// 设置节点Value
		map.put("Value", getAllValueInfo(nodeInfoJsonObject,lineInfoJsonObject));
		return map;
	}

	@SuppressWarnings("rawtypes")
	@Override
	protected List<List<?>> getAllValueInfo(JSONObject nodeInfoJsonObject, JSONObject lineInfoJsonObject) {
		Map<String,String> idMap=new HashMap<String,String>();			
		getValue(nodeInfoJsonObject.toString(),idMap);
		 List<List<?>> resultList=new ArrayList<List<?>>();
		for(Map.Entry<String,String> entry:idMap.entrySet()){
			 JSONObject tmpObject = JSON.parseObject(entry.getValue().toString());
			 if(!"area".equals(tmpObject.get("type").toString())) continue;
			 List tmpList=new ArrayList();			 
			 getEveryElementByArea(tmpObject,tmpList,tmpObject.get("type").toString());
			 resultList.add(tmpList);
		}
		return resultList;
	}
	
	/**
	* 描述：获取循环域信息各个元素的值：id name  loopType data
	* @Title: getEveryElementByArea
	* @param tmpObject
	* @param tmpList
	* @param type
	* @return
	* @author weiyongpeng
	* @date  2024年7月15日 下午3:00:23
	 */
	@SuppressWarnings({"unchecked","rawtypes"})
	public  List<List<?>> getEveryElementByArea(JSONObject tmpObject, List tmpList,String type) {
		tmpList.add(tmpObject.get("id").toString()); // 获取id
		tmpList.add(tmpObject.get("name") == null ? "" : tmpObject.get("name").toString()); // 获取name
		tmpList.add(tmpObject.get("loopType").toString()); // 获取type
		tmpList.add(tmpObject.get("if") == null ? "" : concatStr(tmpObject.get("if").toString()));
		return tmpList;
	}
	
	/**
	* 描述：对if、success、failed各个环节的数据进行拼接
	* @Title: concatStr
	* @param str if、success、failed对应的字符串
	* @return 每个文档域之间已“#”分割，每个条件之间已“&@”分割
	* @author weiyongpeng
	* @date  2024年7月15日 下午3:05:55
	 */
	public  String concatStr(String str){
		String value="";
		JSONArray tmpObject = JSON.parseArray(str);
		if(null==tmpObject) return "";
		for(int i=0;i<tmpObject.size();i++){
			JSONArray tmpArray =tmpObject.getJSONArray(i);
			for(int m=0;m<tmpArray.size();m++){
				JSONObject tmpObj=(JSONObject) tmpArray.get(m);
				String tmp="";
				if(tmpObj.get("value")==null||"undefined".equals(tmpObj.get("value").toString())||"".equals(tmpObj.get("value").toString())){
					tmp="";
				}else{
					if(tmpObj.get("class")==null){ //判断是否引用外部方法，如果引用则需要将方法路径拼接到方法名前
						tmp=tmpObj.get("value").toString().replace(" ", "");
					}else{
						tmp="^"+tmpObj.get("class").toString()+"."+tmpObj.get("value").toString()+"^";
					}
					
				}
				value+=tmp;
			    value+="#";  
			}
				value+="&@"; 
		}
		return value;
	}

	@Override
	public void onEvent(AppBeanLoadEndEvent event) throws Throwable {
		NodeParseFactory.register(ParseTypeEnums.AREA_INFO.getParsetype(), this);
	}



}
